热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

微分方程的数值解法——常微分方程——欧拉法与改进欧拉法(2)

改进欧拉法与上一篇中实例相比,改进欧拉法多了一步修正过程,正是应为有了该一步修正过程使得数值解法具有更高一级精度。先看下面两幅图,第一幅是没有改进的欧拉法,第二幅是改进的欧拉法两者相

改进欧拉法

与上一篇中实例相比,改进欧拉法多了一步修正过程,正是应为有了该一步修正过程使得数值解法具有更高一级精度。
先看下面两幅图,第一幅是没有改进的欧拉法,第二幅是改进的欧拉法
这里写图片描述
这里写图片描述
两者相比误差有很大的提高。
下式即为改进欧拉法的修正公式,即梯形公式,
这里写图片描述
其中右边项中的i+1使用的时传统欧拉法的预估值。对当前值进行进一步修正。
代码如下:

%微分方程数值解法----欧拉法测试
%-------------------------------------
clc;
clear all;
close all;
%-------------------------------------
%du/dt + u^2 = 0
%u(0)=1
%-------------------------------------
N = 100;
t_s = 0;
t_e = 1;
dt = (t_e-t_s)/N;
t = t_s:dt:t_e-dt;

M=2;
%-------------------------------------
%解析解
u_j=1./(1+t);
u_s(1) = 1;
for i=2:N
if M==1
u_s(i)=-u_s(i-1)^2*dt+u_s(i-1);
elseif M==2
u_s(i)=-u_s(i-1)^2*dt+u_s(i-1);%预测
u_s(i)=u_s(i-1)+(-u_s(i)^2-u_s(i-1)^2)*dt/2;
end
end
subplot(2,1,1);
plot(t,u_j,'-o',t,u_s,'-*');
xlabel('t');
ylabel('y');
legend('解析解','数值解');
subplot(2,1,2);
plot(t,u_j-u_s,'-r');
xlabel('t');
ylabel('err');
legend('误差');

运行结果如下:
这里写图片描述


推荐阅读
author-avatar
sj_Ford
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有